# -*- coding: utf-8 -*-
# @Time : 2021/10/13 16:13
# @Author : Yinkay·Huang
# @File : life.py
# -*- coding: utf-8 -*-

import pygame

# 颜色常量
GREEN, WHITE, GRAY = (0, 255, 0), (255, 255, 255), (200, 200, 200)
# pygame初始化
pygame.init()
# 设置窗口屏幕尺寸
screen = pygame.display.set_mode((750, 750))
# 设置窗口标题文本
pygame.display.set_caption("生命游戏")


# 屏幕初始化函数
def init_screen():
    screen.fill(WHITE)
    # 将屏幕填充白色，并绘制纵横各75条灰色线段，
    for i in range(75):
        pygame.draw.line(screen, GRAY, (i * 10, 0), (i * 10, 750))
        pygame.draw.line(screen, GRAY, (0, i * 10), (750, i * 10))
    pygame.display.update()


# 相邻细胞计数函数
def kin_count(x, y):
    count = 0
    kins = [
        (x - 10, y - 10), (x, y - 10), (x + 10, y - 10), (x - 10, y),
        (x + 10, y), (x - 10, y + 10), (x, y + 10), (x + 10, y + 10)
    ]
    kins = [(x, y) for x, y in kins if 0 < x < 750 and 0 < y < 750]
    for kin in kins:
        # 判断指定位置的八个附近位置的颜色   
        if screen.get_at(kin) == GREEN:
            count += 1
    return count


# 生成背景网格
init_screen()

# 创建列表cells来存放细胞坐标
cells = []

# 定义一个事件循环，并处理程序退出事件
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

        # 处理鼠标点击事件
        if event.type == pygame.MOUSEBUTTONUP:
            if screen.get_at(event.pos) == WHITE:  # 如果点击位置的颜色为白色，说明没有细胞
                # 定义一个细胞坐标为位置所在网格的左上角
                x, y = event.pos
                cellx, celly = x - x % 10, y - y % 10
                # 根据细胞坐标创建并绘制相应的绿色方块
                cell = pygame.Rect(cellx, celly, 10, 10)
                pygame.draw.rect(screen, GREEN, cell)
                # 将细胞坐标存入cells列表并刷新屏幕
                cells.append((cellx, celly))
                pygame.display.update()
        if event.type == pygame.KEYDOWN:
            # 空格事件
            if event.key == pygame.K_SPACE:
                clock = pygame.time.Clock()
                # 每秒刷新10帧
                clock.tick(10)
                turn = 0
                # 有细胞存活时，最多执行1000轮
                f = 0
                while len(cells) > 0 and turn < 1000:
                    turn += 1
                    pygame.display.set_caption("世代:%s" % turn)
                    # 遍历所有网格 
                    for x in range(5, 750, 10):
                        for y in range(5, 750, 10):
                            # 这个格子有细胞
                            if screen.get_at((x, y)) == GREEN:
                                # 当一个细胞的相邻细胞数不为2或3时，死亡
                                if kin_count(x, y) not in [2, 3]:
                                    cells.remove((x - 5, y - 5))
                            # 这个格子没有细胞
                            else:
                                # 相邻细胞数为3时产生新细胞
                                if kin_count(x, y) == 3:
                                    cells.append((x - 5, y - 5))
                    # 绘制所有细胞
                    init_screen()
                    for cellx, celly in cells:
                        cell = pygame.Rect(cellx, celly, 10, 10)
                        pygame.draw.rect(screen, GREEN, cell)
                    if f == 3:
                        pygame.display.update()
                    else:
                        f += 1
